package com.textformat.core;

import com.textformat.common.FileUtils;
import com.textformat.core.InputAndOutput.Input;
import com.textformat.core.InputAndOutput.InputFormat;
import com.textformat.core.InputAndOutput.Output;
import com.textformat.core.InputAndOutput.OutputFormat;
import com.textformat.core.InputAndOutput.impl.InputEnum;
import com.textformat.core.InputAndOutput.impl.InputFormatEnum;
import com.textformat.core.InputAndOutput.impl.OutputEnum;
import com.textformat.core.InputAndOutput.impl.OutputFormatEnum;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * 文本格式化执行器
 *
 * 文本格式化的过程：
 * 1、读取文本（去哪儿读取文本，由 Input 定义）
 * 2、读取时文本的格式     （确定读取时什么格式，由 InputFormat 定义）
 * 3、转换成什么格式的文本 （确定转换成什么格式，由 OutputFormat 定义）
 * 4、文本输出（文本输出到哪儿，由 Output 定义）
 */
@Slf4j
public class TextFormsssss {
    // 每个执行器对应可以多个转换信息表
    private List<TextInFo> textInFos;
    // 输入内容
    private List<String> inputList;
    // 输出内容
    private List<String> outputList;


    /**
     * 初始化执行器
     */
    public static TextForm init(){
        log.info("文本转换器>>> 开始初始化");
        return new TextForm()
                .initTextInFos()
                .initInputList()
                .input()
                .initOutputList()
                .output();
    }


    /**
     * 初始化任务列表信息
     */
    public TextForm initTextInFos(){
        this.textInFos = new ArrayList<TextInFo>();
        return this;
    }
    /**
     * 初始化输入文本
     */
    public TextForm initInputList(){
        this.inputList = new ArrayList<>();
        return this;
    }
    /**
     * 初始化输出文本
     */
    public TextForm initOutputList(){
        this.outputList = new ArrayList<>();
        return this;
    }

    /**
     * 输入(默认方式：控制台输入)
     */
    public TextForm input(){
        this.textInFos.add(
                new TextInFo()
                        .setInputType(InputEnum.CONSOLE)
                        .setOutputType(OutputEnum.CONSOLE));
        return this;
    }

    /**
     * 输出,(默认方式：控制台输出)
     */
    public TextForm output(){ return this;}

    /**
     * 输入,输入文件，根据传入文件名判断读取文件方式
     */
    public TextForm input(String fileName){

        Input inputType;
        if(FileUtils.isTxtFile(fileName)){
            inputType = InputEnum.FILE_TXT;
        }else if(FileUtils.isXlsFile(fileName)){
            inputType = InputEnum.FILE_XLS;
        }else if(FileUtils.isPdfFile(fileName)){
            inputType = InputEnum.FILE_PDF;
        }else if(FileUtils.isCsvFile(fileName)){
            inputType = InputEnum.FILE_CSV;
        }else {
            inputType = InputEnum.FILE_TXT;
        }

        this.textInFo
                .setInputFormat(InputFormatEnum.LIST)
                .setInputType(inputType)
                .setFileName(fileName);

        return this;
    }

    /**
     * 输入,文本内容是list
     */
    public TextForm input(Input input,String fileName){
        this.textInFo
                .setInputFormat(InputFormatEnum.LIST)
                .setInputType(input)
                .setFileName(fileName);
        return this;
    }

    /**
     * 输入
     */
    public TextForm input(Input input,InputFormat inputFormat,String fileName){
        this.textInFo
                .setInputFormat(inputFormat)
                .setInputType(input)
                .setFileName(fileName);
        return this;
    }



    /**
     * 输出,输出文本为list,输出文件自动命名
     */
    public TextForm output(Output outputType){
        this.textInFo
                .setOutputType(outputType)
                .setOutputFormat(OutputFormatEnum.LIST);
        return this;
    }

    /**
     * 输出
     */
    public TextForm output(Output outputType, OutputFormat outputFormat){
        this.textInFo
                .setOutputType(outputType)
                .setOutputFormat(outputFormat);
        return this;
    }

    /**
     * 执行器
     */
    public void end(){
        // 获取任务信息表
        List<TextInFo> inFos = this.textInFos;
        if(inFos.size()==0){
            inFos.add(new TextInFo()
                    .setInputType(InputEnum.CONSOLE)
                    .setOutputType(OutputEnum.CONSOLE));
        }

        log.info("文本转换器>>> "+inFos.toString());

        // 执行获取文本内容
        inFos.forEach(s->{
            this.inputList.addAll(s.getInputType().getText(s.getFileName()));
            this.inputList.add(s.getFileName());

        });
        this.inputList = ti.getInputType().getText(inFo.getFileName());
        this.outputList = new ArrayList<>();

        // 执行文本格式化
        List<String> inputList = this.inputList;
        if(inputList != null) {
            String oneLine = "";
            for (int i = 0; i<inputList.size(); i++){
                oneLine = "这是第" + (i+1) + "行内容："+ inputList.get(i);
                this.outputList.add(oneLine);
            }
            log.info("文本转换器>>> 格式化内容正在输出");
            this.outputList.forEach(System.out::println);
        }

        // 执行输出文本内容
    }

}
